/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.egg_pro.modular.eggproduct.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vip.xiaonuo.column.modular.column.entity.BizColumn;
import vip.xiaonuo.column.modular.column.mapper.BizColumnMapper;
import vip.xiaonuo.common.enums.CommonSortOrderEnum;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.page.CommonPageRequest;
import vip.xiaonuo.egg_pro.modular.eggproduct.entity.BizEggProduct;
import vip.xiaonuo.egg_pro.modular.eggproduct.entity.EggProductView;
import vip.xiaonuo.egg_pro.modular.eggproduct.mapper.BizEggProductMapper;
import vip.xiaonuo.egg_pro.modular.eggproduct.mapper.EggProductViewMapper;
import vip.xiaonuo.egg_pro.modular.eggproduct.param.BizEggProductAddParam;
import vip.xiaonuo.egg_pro.modular.eggproduct.param.BizEggProductEditParam;
import vip.xiaonuo.egg_pro.modular.eggproduct.param.BizEggProductIdParam;
import vip.xiaonuo.egg_pro.modular.eggproduct.param.BizEggProductPageParam;
import vip.xiaonuo.egg_pro.modular.eggproduct.service.BizEggProductService;

import javax.annotation.Resource;
import java.util.List;

/**
 * 鸡蛋产出Service接口实现类
 *
 * @author zyb
 * @date  2023/12/18 16:36
 **/
@Service
public class BizEggProductServiceImpl extends ServiceImpl<BizEggProductMapper, BizEggProduct> implements BizEggProductService {

    @Resource
    private BizColumnMapper columnMapper;

    @Resource
    private EggProductViewMapper eggProductViewMapper;

    private static final String BROILER_TYPE = "肉鸡";
    private static final String LAYER_TYPE = "蛋鸡";
    private static final String ERROE_TYPE = "异常类型";

    @Override
    public Page<EggProductView> page(BizEggProductPageParam bizEggProductPageParam) {
        QueryWrapper<EggProductView> queryWrapper = new QueryWrapper<>();
        if(ObjectUtil.isNotEmpty(bizEggProductPageParam.getBarnId())) {
            queryWrapper.lambda().eq(EggProductView::getBarnId, bizEggProductPageParam.getBarnId());
        }
        if(ObjectUtil.isNotEmpty(bizEggProductPageParam.getStartLayDate()) && ObjectUtil.isNotEmpty(bizEggProductPageParam.getEndLayDate())) {
            queryWrapper.lambda().between(EggProductView::getLayDate, bizEggProductPageParam.getStartLayDate(), bizEggProductPageParam.getEndLayDate());
        }
        if(ObjectUtil.isNotEmpty(bizEggProductPageParam.getEggType())) {
            queryWrapper.lambda().eq(EggProductView::getEggType, bizEggProductPageParam.getEggType());
        }
        if(ObjectUtil.isAllNotEmpty(bizEggProductPageParam.getSortField(), bizEggProductPageParam.getSortOrder())) {
            CommonSortOrderEnum.validate(bizEggProductPageParam.getSortOrder());
            queryWrapper.orderBy(true, bizEggProductPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
                    StrUtil.toUnderlineCase(bizEggProductPageParam.getSortField()));
        } else {
            queryWrapper.lambda().orderByAsc(EggProductView::getId);
        }
        return eggProductViewMapper.selectPage(CommonPageRequest.defaultPage(), queryWrapper);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void add(BizEggProductAddParam bizEggProductAddParam) {
        BizEggProduct bizEggProduct = BeanUtil.toBean(bizEggProductAddParam, BizEggProduct.class);
        this.save(bizEggProduct);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void edit(BizEggProductEditParam bizEggProductEditParam) {
        BizEggProduct bizEggProduct = this.queryEntity(bizEggProductEditParam.getId());
        BeanUtil.copyProperties(bizEggProductEditParam, bizEggProduct);
        this.updateById(bizEggProduct);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<BizEggProductIdParam> bizEggProductIdParamList) {
        // 执行删除
        this.removeByIds(CollStreamUtil.toList(bizEggProductIdParamList, BizEggProductIdParam::getId));
    }

    @Override
    public BizEggProduct detail(BizEggProductIdParam bizEggProductIdParam) {
        return this.queryEntity(bizEggProductIdParam.getId());
    }

    @Override
    public BizEggProduct queryEntity(Integer id) {
        BizEggProduct bizEggProduct = this.getById(id);
        if(ObjectUtil.isEmpty(bizEggProduct)) {
            throw new CommonException("鸡蛋产出记录不存在，id值为：{}", id);
        }
        return bizEggProduct;
    }

    @Override
    public String getType(String columnId) {
        BizColumn column = columnMapper.selectById(columnId);
        if(ObjectUtil.isNotEmpty(column)) {
            String sign = column.getSign();
            if (LAYER_TYPE.equals(sign)){
                return column.getTypeId();
            }
            else if (BROILER_TYPE.equals(sign)){
                throw new CommonException("警告！该栏区不是蛋鸡栏区，请重新选择！");
            }
        }
        else{
            throw new CommonException("未选择栏区信息！");
        }
        return ERROE_TYPE;
    }
}
